package laponderosa.metroflamenco;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import laponderosa.metronomosimple.R;

public class MainActivity extends Activity {

	AudioGenerator audio = new AudioGenerator(8000);
	boolean tocar;
	String temp;
	boolean seguro;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		final Button afina = (Button) findViewById(R.id.afinador);
		final TextView indicador = (TextView) findViewById(R.id.textView);
		final Button rapido = (Button) findViewById(R.id.button2);
		final SeekBar barra = (SeekBar) findViewById(R.id.seekbar1);

		tocar = true;
		seguro = true;
		afina.setEnabled(true);
		barra.setEnabled(true);
		
		// SETEOS INICIALES
		rapido.setBackgroundResource(R.drawable.botonverde);
		afina.setBackgroundResource(R.drawable.afinaoff);
		indicador.setText("70 BPM");

		// PRENDO Y APAGO EL METRO
		rapido.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				if (seguro) {

					// SE EJECUTA EL METRO y se apaga el afinador

					afina.setEnabled(false);
					barra.setEnabled(false);

					seguro = false;
					tocar = false;
					hilo task = new hilo();
					task.execute(String.valueOf(barra.getProgress() + 30));
					rapido.setBackgroundResource(R.drawable.botonrojo);
					rapido.setText(R.string.parar);
				} else {

					// SE PARA EL METRO
					afina.setEnabled(true);
					barra.setEnabled(true);

					seguro = true;
					tocar = false;
					rapido.setBackgroundResource(R.drawable.botonverde);
					rapido.setText(R.string.iniciar);
				}
			}
		});

		// PRENDO Y APAGO EL AFINADOR
		afina.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				if (seguro) {

					// SE EJECUTA EL AFINADOR

					rapido.setEnabled(false);
					barra.setEnabled(false);
					afina.setBackgroundResource(R.drawable.afinaon);

					seguro = false;
					tocar = false;
					afinador task = new afinador();
					task.execute(String.valueOf(barra.getProgress() + 30));

				} else {

					// SE PARA EL AFINADOR
					rapido.setEnabled(true);
					barra.setEnabled(true);
					afina.setBackgroundResource(R.drawable.afinaoff);

					seguro = true;
					tocar = false;

				}
			}
		});

		// CAPTURO EVENTOS DE LA BARRA
		barra.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				indicador.setText(progress + 30 + " BPM");
			}

			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub
			}

			public void onStopTrackingTouch(SeekBar seekBar) {

			}
		});

	}

	private class hilo extends AsyncTask<String, Void, String> {
		@Override
		protected String doInBackground(String... tiempo) {
			float silence = ((60 * 8000) / Integer.parseInt(tiempo[0])) - 100;
			// Log.i("SILENCIO", String.valueOf(silence));
			try {
				// Do database operation
				double[] doNote = audio.getSineWave(100, 8000, 523.25);
				double[] miNote = audio.getSineWave((int) silence, 8000, 0);

				tocar = false;
				tocar = true;

				audio.createPlayer();

				while (tocar) {
					audio.writeSound(doNote);
					audio.writeSound(miNote);
				}

				audio.destroyAudioTrack();
			} catch (Exception e) {
				Log.i("ERROR ERROR", e.getMessage());
			}
			return "";
		}

		@Override
		protected void onPostExecute(String result) {

		}
	}

	private class afinador extends AsyncTask<String, Void, String> {
		@Override
		protected String doInBackground(String... tiempo) {
			// Log.i("SILENCIO", String.valueOf(silence));
			try {
				// Do database operation
				double[] doNote = audio.getSineWave(1000, 8000, 400);
				tocar = false;
				tocar = true;

				audio.createPlayer();

				while (tocar) {
					audio.writeSound(doNote);
				}

				audio.destroyAudioTrack();
			} catch (Exception e) {
				Log.i("ERROR ERROR", e.getMessage());
			}
			return "";
		}

		@Override
		protected void onPostExecute(String result) {

		}
	}

	@Override
	protected void onPause() {
		super.onPause();
		notify("onPause");
		seguro = true;
		tocar = false;
	}

	@Override
	protected void onResume() {
		super.onResume();
		notify("onResumen");
		seguro = true;
		tocar = false;
	}

	@Override
	protected void onStop() {
		super.onStop();
		notify("onStopa");
		seguro = true;
		tocar = false;
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		notify("onDestroy");
		seguro = true;
		tocar = false;
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		notify("onRestoreInstanceState");
		seguro = true;
		tocar = false;
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		notify("onSaveInstanceState");
		seguro = true;
		tocar = false;
	}

	private void notify(String methodName) {
		Log.i("ESTADiypo", methodName);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}
